Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


vendor/rns_over_http/HTTPInterface.py b960db2e8bf87b96c14f6421402a16798d7a9ded (b960db2e) Text, 32.34 KB

Tff7b72import T7ee787asyncio
Tff7b72import T7ee787os
Tff7b72import T7ee787socket
Tff7b72import T7ee787ssl
Tff7b72import T7ee787threading
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787httpT7ee787.T7ee787server Tff7b72import Te6edf3BaseHTTPRequestHandlerTb4b4b4, Te6edf3HTTPServer
Tff7b72from T7ee787queue Tff7b72import Te6edf3EmptyTb4b4b4, Te6edf3Queue
Tff7b72from T7ee787socketserver Tff7b72import Te6edf3ThreadingMixIn
Tff7b72from T7ee787urllibT7ee787.T7ee787parse Tff7b72import Te6edf3urlparse

Tff7b72import T7ee787httpx
Tff7b72import T7ee787RNS
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface


Tff7b72class T56d364HDLCTb4b4b4:
T8b949e"""Pipe-compatible simplified HDLC framing for HTTP bodies.

Same FLAG/ESC scheme as RNS PipeInterface so multiple packets can
share one HTTP request or response without losing boundaries.
"""

Te6edf3FLAG Tff7b72= T79c0ff0x7E
Te6edf3ESC Tff7b72= T79c0ff0x7D
Te6edf3ESC_MASK Tff7b72= T79c0ff0x20

Tf0883e@staticmethod
Tff7b72def Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(
Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESC Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(
Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAG Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3data

Tf0883e@staticmethod
Tff7b72def Td2a8ffframeTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4) Tff7b72+ Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3packetTb4b4b4) Tff7b72+ Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffdeframeTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3max_frame_lenTb4b4b4)Tb4b4b4:
T8b949e"""Return (packets, remainder) from an HDLC byte buffer."""
Te6edf3packets Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3in_frame Tff7b72= Tff7b72False
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Te6edf3last_complete Tff7b72= T79c0ff0

Tff7b72while Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]
Te6edf3i Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3in_frame Tff7b72and Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4:
Te6edf3packetsTff7b72.Td2a8ffappendTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3data_bufferTb4b4b4)Tb4b4b4)
Te6edf3in_frame Tff7b72= Tff7b72False
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3last_complete Tff7b72= Te6edf3i
Tff7b72elif Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72True
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3in_frame Tff7b72and Tffa657lenTb4b4b4(Te6edf3data_bufferTb4b4b4) Tff7b72< Te6edf3max_frame_lenTb4b4b4:
Tff7b72if Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4:
Te6edf3escape Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3escapeTb4b4b4:
Tff7b72if Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffFLAG Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4:
Te6edf3byte Tff7b72= Te6edf3HDLCTff7b72.Td2a8ffFLAG
Tff7b72elif Te6edf3byte Tff7b72== Te6edf3HDLCTff7b72.Td2a8ffESC Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4:
Te6edf3byte Tff7b72= Te6edf3HDLCTff7b72.Td2a8ffESC
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_bufferTff7b72.Td2a8ffappendTb4b4b4(Te6edf3byteTb4b4b4)

Te6edf3remainder Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3last_completeTb4b4b4:Tb4b4b4] Tff7b72if Te6edf3in_frame Tff7b72else Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72return Te6edf3packetsTb4b4b4, Te6edf3remainder


Tff7b72class T56d364_H3SessionTb4b4b4:
T8b949e"""Persistent HTTP/3 client over one QUIC connection."""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3server_urlTb4b4b4, Te6edf3user_agentTb4b4b4, Te6edf3verifyTff7b72=Tff7b72TrueTb4b4b4, Te6edf3ca_certsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787aioquicT7ee787.T7ee787asyncio Tff7b72import Te6edf3connect
Tff7b72from T7ee787aioquicT7ee787.T7ee787asyncioT7ee787.T7ee787protocol Tff7b72import Te6edf3QuicConnectionProtocol
Tff7b72from T7ee787aioquicT7ee787.T7ee787h3T7ee787.T7ee787connection Tff7b72import Te6edf3H3_ALPNTb4b4b4, Te6edf3H3Connection
Tff7b72from T7ee787aioquicT7ee787.T7ee787h3T7ee787.T7ee787events Tff7b72import Te6edf3DataReceivedTb4b4b4, Te6edf3HeadersReceived
Tff7b72from T7ee787aioquicT7ee787.T7ee787quicT7ee787.T7ee787configuration Tff7b72import Te6edf3QuicConfiguration
Tff7b72from T7ee787aioquicT7ee787.T7ee787quicT7ee787.T7ee787events Tff7b72import Te6edf3QuicEvent

Te6edf3parsed Tff7b72= Te6edf3urlparseTb4b4b4(Te6edf3server_urlTb4b4b4)
Tff7b72if Te6edf3parsedTff7b72.Td2a8ffscheme Tff7b72!= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffHTTP/3 requires an https:// server_urlTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_host Tff7b72= Te6edf3parsedTff7b72.Td2a8ffhostname
Tff7b72selfTff7b72.Td2a8ff_port Tff7b72= Te6edf3parsedTff7b72.Td2a8ffport Tff7b72or T79c0ff443
Tff7b72selfTff7b72.Td2a8ff_path Tff7b72= Te6edf3parsedTff7b72.Td2a8ffpath Tff7b72or Ta5d6ff"Ta5d6ff/Ta5d6ff"
Tff7b72if Te6edf3parsedTff7b72.Td2a8ffqueryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_path Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff?Ta5d6ff" Tff7b72+ Te6edf3parsedTff7b72.Td2a8ffquery
Tff7b72selfTff7b72.Td2a8ff_authority Tff7b72= Te6edf3parsedTff7b72.Td2a8ffnetloc
Tff7b72selfTff7b72.Td2a8ff_user_agent Tff7b72= Te6edf3user_agent
Tff7b72selfTff7b72.Td2a8ff_closed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_request_count Tff7b72= T79c0ff0

Te6edf3configuration Tff7b72= Te6edf3QuicConfigurationTb4b4b4(Te6edf3is_clientTff7b72=Tff7b72TrueTb4b4b4, Te6edf3alpn_protocolsTff7b72=Te6edf3H3_ALPNTb4b4b4)
Tff7b72if Tff7b72not Te6edf3verifyTb4b4b4:
Te6edf3configurationTff7b72.Td2a8ffverify_mode Tff7b72= Te6edf3sslTff7b72.Td2a8ffCERT_NONE
Tff7b72elif Te6edf3ca_certsTb4b4b4:
Te6edf3configurationTff7b72.Td2a8ffload_verify_locationsTb4b4b4(Te6edf3ca_certsTb4b4b4)

Tff7b72class T56d364_ClientTb4b4b4(Te6edf3QuicConnectionProtocolTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http Tff7b72= Te6edf3H3ConnectionTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_quicTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_request_events Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_request_waiter Tff7b72= Tb4b4b4{Tb4b4b4}

Tff7b72def Td2a8ffhttp_event_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3eventTb4b4b4, Tb4b4b4(Te6edf3HeadersReceivedTb4b4b4, Te6edf3DataReceivedTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3stream_id Tff7b72= Te6edf3eventTff7b72.Td2a8ffstream_id
Tff7b72if Te6edf3stream_id Tff7b72in Tff7b72selfTff7b72.Td2a8ff_request_eventsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_request_eventsTb4b4b4[Te6edf3stream_idTb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3eventTb4b4b4)
Tff7b72if Te6edf3eventTff7b72.Td2a8ffstream_endedTb4b4b4:
Te6edf3waiter Tff7b72= Tff7b72selfTff7b72.Td2a8ff_request_waiterTff7b72.Td2a8ffpopTb4b4b4(Te6edf3stream_idTb4b4b4)
Te6edf3waiterTff7b72.Td2a8ffset_resultTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_request_eventsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3stream_idTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffquic_event_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eventTb4b4b4: Te6edf3QuicEventTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3http_event Tff7b72in Tff7b72selfTff7b72.Td2a8ff_httpTff7b72.Td2a8ffhandle_eventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhttp_event_receivedTb4b4b4(Te6edf3http_eventTb4b4b4)

Tff7b72async Tff7b72def Td2a8ffpost_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3authorityTb4b4b4, Te6edf3user_agentTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3stream_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff_quicTff7b72.Td2a8ffget_next_available_stream_idTb4b4b4(Tb4b4b4)
Te6edf3headers Tff7b72= Tb4b4b4[
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff:methodTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff:schemeTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff:authorityTa5d6ff"Tb4b4b4, Te6edf3authorityTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff:pathTa5d6ff"Tb4b4b4, Te6edf3pathTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffuser-agentTa5d6ff"Tb4b4b4, Te6edf3user_agentTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffcontent-typeTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffapplication/octet-streamTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffcontent-lengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_httpTff7b72.Td2a8ffsend_headersTb4b4b4(
Te6edf3stream_idTff7b72=Te6edf3stream_idTb4b4b4,
Te6edf3headersTff7b72=Te6edf3headersTb4b4b4,
Te6edf3end_streamTff7b72=Tff7b72not Te6edf3dataTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3dataTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_httpTff7b72.Td2a8ffsend_dataTb4b4b4(Te6edf3stream_idTff7b72=Te6edf3stream_idTb4b4b4, Te6edf3dataTff7b72=Te6edf3dataTb4b4b4, Te6edf3end_streamTff7b72=Tff7b72TrueTb4b4b4)

Te6edf3waiter Tff7b72= Tff7b72selfTff7b72.Td2a8ff_loopTff7b72.Td2a8ffcreate_futureTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_request_eventsTb4b4b4[Te6edf3stream_idTb4b4b4] Tff7b72= Te6edf3dequeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_request_waiterTb4b4b4[Te6edf3stream_idTb4b4b4] Tff7b72= Te6edf3waiter
Tff7b72selfTff7b72.Td2a8fftransmitTb4b4b4(Tb4b4b4)
Te6edf3events Tff7b72= Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffshieldTb4b4b4(Te6edf3waiterTb4b4b4)

Te6edf3status Tff7b72= T79c0ff0
Te6edf3body Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3event Tff7b72in Te6edf3eventsTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3HeadersReceivedTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3keyTb4b4b4, Te6edf3value Tff7b72in Te6edf3eventTff7b72.Td2a8ffheadersTb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ff:statusTa5d6ff"Tb4b4b4:
Te6edf3status Tff7b72= Tffa657intTb4b4b4(Te6edf3valueTff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3DataReceivedTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72+Tff7b72= Te6edf3eventTff7b72.Td2a8ffdata
Tff7b72return Te6edf3statusTb4b4b4, Te6edf3body

Tff7b72selfTff7b72.Td2a8ff_Client Tff7b72= Te6edf3_Client
Tff7b72selfTff7b72.Td2a8ff_connect Tff7b72= Te6edf3connect
Tff7b72selfTff7b72.Td2a8ff_configuration Tff7b72= Te6edf3configuration
Tff7b72selfTff7b72.Td2a8ff_loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffnew_event_loopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_loop_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_run_loopTb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffh3-client-loopTa5d6ff"Tb4b4b4,
Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ready Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_error Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_client Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_cm Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_loop_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_readyTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff30Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Ta5d6ff"Ta5d6ffHTTP/3 client failed to connectTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_error Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72raise Tff7b72selfTff7b72.Td2a8ff_error

Tff7b72def Td2a8ff_run_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3asyncioTff7b72.Td2a8ffset_event_loopTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_loopTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_loopTff7b72.Td2a8ffrun_until_completeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_openTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_readyTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_loopTff7b72.Td2a8ffrun_foreverTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_error Tff7b72= Te6edf3exc
Tff7b72selfTff7b72.Td2a8ff_readyTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)

Tff7b72async Tff7b72def Td2a8ff_openTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_cm Tff7b72= Tff7b72selfTff7b72.Td2a8ff_connectTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_portTb4b4b4,
Te6edf3configurationTff7b72=Tff7b72selfTff7b72.Td2a8ff_configurationTb4b4b4,
Te6edf3create_protocolTff7b72=Tff7b72selfTff7b72.Td2a8ff_ClientTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_client Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8ff_cmTff7b72.Td2a8ff__aenter__Tb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffpostTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff10.0Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_closedTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffHTTP/3 session is closedTa5d6ff"Tb4b4b4)

Tff7b72async Tff7b72def Td2a8ff_do_postTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3statusTb4b4b4, Te6edf3body Tff7b72= Tff7b72await Tff7b72selfTff7b72.Td2a8ff_clientTff7b72.Td2a8ffpost_bytesTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_pathTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_authorityTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_user_agentTb4b4b4,
Te6edf3dataTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_request_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3status Tff7b72>Tff7b72= T79c0ff400Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTTP/3 status Tffd700{Te6edf3statusTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3body

Te6edf3fut Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffrun_coroutine_threadsafeTb4b4b4(Te6edf3_do_postTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_loopTb4b4b4)
Tff7b72return Te6edf3futTff7b72.Td2a8ffresultTb4b4b4(Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4)

Tff7b72def Td2a8ffcloseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_closedTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_closed Tff7b72= Tff7b72True

Tff7b72async Tff7b72def Td2a8ff_closeTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_cm Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72await Tff7b72selfTff7b72.Td2a8ff_cmTff7b72.Td2a8ff__aexit__Tb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3fut Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffrun_coroutine_threadsafeTb4b4b4(Te6edf3_closeTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_loopTb4b4b4)
Te6edf3futTff7b72.Td2a8ffresultTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_loopTff7b72.Td2a8ffstopTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_loop_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)


Tff7b72class T56d364HTTPTunnelInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
T8b949e"""HTTP Tunnel Interface for Reticulum.

Bidirectional RNS transport over HTTP POST with pipe-compatible HDLC
framing. Supports HTTP/1.1 (default), HTTP/2, and HTTP/3.

Engineering defaults:
- http_version=1 uses a stdlib HTTP/1.1 server and httpx client.
Works over cleartext http:// and is ideal behind Caddy/nginx.
- http_version=2 requires TLS and uses Hypercorn (h2) + httpx(http2).
- http_version=3 requires TLS and uses Hypercorn QUIC + a persistent
aioquic HTTP/3 client session.

Configuration highlights:
http_version: 1, 2, or 3 (default: 1)
tls_certfile / tls_keyfile: required for versions 2 and 3 on server
tls_verify: verify TLS certs on client (default: true)
tls_ca_certs: optional CA bundle path for client verify
server_url: use https:// for versions 2 and 3
"""

Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16
Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10_000_000
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True

Te6edf3DEFAULT_MTU Tff7b72= T79c0ff4096
Te6edf3TUNNEL_USER_AGENT Tff7b72= Ta5d6ff"Ta5d6ffRNS-HTTP-Tunnel/1.0Ta5d6ff"
Te6edf3DEFAULT_POLL_INTERVAL Tff7b72= T79c0ff0.1
Te6edf3DEFAULT_POOL_CONNECTIONS Tff7b72= T79c0ff1
Te6edf3DEFAULT_POOL_MAXSIZE Tff7b72= T79c0ff1
Te6edf3DEFAULT_KEEPALIVE_TIMEOUT Tff7b72= T79c0ff60
Te6edf3DEFAULT_HTTP_VERSION Tff7b72= T79c0ff1

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)

Te6edf3ifconf Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]

Te6edf3mode Tff7b72= Tffa657strTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffmodeTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Ta5d6ff"Ta5d6ffclientTa5d6ff"
Te6edf3listen_host Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fflisten_hostTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fflisten_hostTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Ta5d6ff"Ta5d6ff0.0.0.0Ta5d6ff"
Te6edf3listen_port Tff7b72= Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fflisten_portTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else T79c0ff8080
Te6edf3server_url Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffserver_urlTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffserver_urlTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None
Te6edf3poll_interval Tff7b72= Tb4b4b4(
Tffa657floatTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffpoll_intervalTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffpoll_intervalTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_POLL_INTERVAL
Tb4b4b4)
Te6edf3check_user_agent Tff7b72= Tb4b4b4(
Te6edf3ifconfTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffcheck_user_agentTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffcheck_user_agentTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72True
Tb4b4b4)
Te6edf3user_agent Tff7b72= Tb4b4b4(
Tffa657strTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffuser_agentTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffuser_agentTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffTUNNEL_USER_AGENT
Tb4b4b4)
Te6edf3mtu Tff7b72= Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffmtuTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffmtuTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_MTU
Te6edf3serve_html_page Tff7b72= Tb4b4b4(
Te6edf3ifconfTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffserve_html_pageTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffserve_html_pageTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72False
Tb4b4b4)
Te6edf3html_file_path Tff7b72= Tb4b4b4(
Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffhtml_file_pathTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffhtml_file_pathTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None
Tb4b4b4)
Te6edf3pool_connections Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffpool_connectionsTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffpool_connectionsTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_POOL_CONNECTIONS
Tb4b4b4)
Te6edf3pool_maxsize Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffpool_maxsizeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffpool_maxsizeTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_POOL_MAXSIZE
Tb4b4b4)
Te6edf3keepalive_timeout Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffkeepalive_timeoutTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffkeepalive_timeoutTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_KEEPALIVE_TIMEOUT
Tb4b4b4)
Te6edf3http_version Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffhttp_versionTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffhttp_versionTa5d6ff" Tff7b72in Te6edf3ifconf
Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_HTTP_VERSION
Tb4b4b4)
Te6edf3tls_certfile Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fftls_certfileTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fftls_certfileTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None
Te6edf3tls_keyfile Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fftls_keyfileTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fftls_keyfileTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None
Te6edf3tls_verify Tff7b72= Tb4b4b4(
Te6edf3ifconfTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6fftls_verifyTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fftls_verifyTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72True
Tb4b4b4)
Te6edf3tls_ca_certs Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fftls_ca_certsTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fftls_ca_certsTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None

Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3mode
Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72= Te6edf3http_version

Tff7b72if Te6edf3mode Tff7b72not Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffInvalid mode Ta5d6ff'Tffd700{Te6edf3modeTffd700}Ta5d6ff'Ta5d6ff for Tffd700{Tff7b72selfTffd700}Ta5d6ff. Must be Ta5d6ff'Ta5d6ffclientTa5d6ff'Ta5d6ff or Ta5d6ff'Ta5d6ffserverTa5d6ff'Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3http_version Tff7b72not Tff7b72in Tb4b4b4(T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffInvalid http_version Ta5d6ff'Tffd700{Te6edf3http_versionTffd700}Ta5d6ff'Ta5d6ff for Tffd700{Tff7b72selfTffd700}Ta5d6ff. Must be 1, 2, or 3Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72and Te6edf3server_url Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo server_url specified for client mode in Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3pool_connections Tff7b72< T79c0ff1 Tff7b72or Te6edf3pool_maxsize Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffpool_connections and pool_maxsize must be >= 1 for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72if Te6edf3http_version Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff" Tff7b72and Tb4b4b4(Tff7b72not Te6edf3tls_certfile Tff7b72or Tff7b72not Te6edf3tls_keyfileTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6fftls_certfile and tls_keyfile are required for Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffHTTP/Tffd700{Te6edf3http_versionTffd700}Ta5d6ff server mode in Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3urlparseTb4b4b4(Te6edf3server_urlTb4b4b4)
Tff7b72if Te6edf3parsedTff7b72.Td2a8ffscheme Tff7b72!= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffHTTP/Tffd700{Te6edf3http_versionTffd700}Ta5d6ff client requires https:// server_url in Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffmtu Tff7b72= Te6edf3mtu
Tff7b72selfTff7b72.Td2a8ffcheck_user_agent Tff7b72= Te6edf3check_user_agent
Tff7b72selfTff7b72.Td2a8ffuser_agent Tff7b72= Te6edf3user_agent
Tff7b72selfTff7b72.Td2a8ffserve_html_page Tff7b72= Te6edf3serve_html_page
Tff7b72selfTff7b72.Td2a8ffhtml_file_path Tff7b72= Te6edf3html_file_path
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpool_connections Tff7b72= Te6edf3pool_connections
Tff7b72selfTff7b72.Td2a8ffpool_maxsize Tff7b72= Te6edf3pool_maxsize
Tff7b72selfTff7b72.Td2a8ffkeepalive_timeout Tff7b72= Te6edf3keepalive_timeout
Tff7b72selfTff7b72.Td2a8fftls_certfile Tff7b72= Te6edf3tls_certfile
Tff7b72selfTff7b72.Td2a8fftls_keyfile Tff7b72= Te6edf3tls_keyfile
Tff7b72selfTff7b72.Td2a8fftls_verify Tff7b72= Te6edf3tls_verify
Tff7b72selfTff7b72.Td2a8fftls_ca_certs Tff7b72= Te6edf3tls_ca_certs
Tff7b72selfTff7b72.Td2a8ff_tcp_accepts Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_http_requests Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_stats_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_http_version Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_client_requests Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffsession Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_h3_session Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_asgi_shutdown Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_asgi_loop Tff7b72= Tff7b72None

Tff7b72if Tff7b72selfTff7b72.Td2a8ffserve_html_page Tff7b72and Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_load_html_contentTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_recv_queue Tff7b72= Te6edf3QueueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_queue Tff7b72= Te6edf3QueueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stop_event Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_frame_remainder Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_frame_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3mtu
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3HTTPTunnelInterfaceTff7b72.Td2a8ffBITRATE_GUESS

Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflisten_host Tff7b72= Te6edf3listen_host
Tff7b72selfTff7b72.Td2a8fflisten_port Tff7b72= Te6edf3listen_port
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffserver_url Tff7b72= Te6edf3server_url
Tff7b72selfTff7b72.Td2a8ffpoll_interval Tff7b72= Te6edf3poll_interval

Tff7b72selfTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3http_version Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsetup_server_http1Tb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsetup_server_asgiTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsetup_clientTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_load_html_contentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLoaded HTML content from Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTML file not found: Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError loading HTML file Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None

Tff7b72def Td2a8ff_drain_send_framesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3parts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffemptyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffget_nowaitTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72break
Tff7b72if Te6edf3packetTb4b4b4:
Te6edf3partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3HDLCTff7b72.Td2a8ffframeTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6ffbTa5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3partsTb4b4b4)

Tff7b72def Td2a8ff_ingest_wire_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3wire_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3wire_dataTb4b4b4:
Tff7b72return

Tff7b72with Tff7b72selfTff7b72.Td2a8ff_frame_lockTb4b4b4:
Te6edf3buffer Tff7b72= Tff7b72selfTff7b72.Td2a8ff_frame_remainder Tff7b72+ Te6edf3wire_data
Te6edf3packetsTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_frame_remainder Tff7b72= Te6edf3HDLCTff7b72.Td2a8ffdeframeTb4b4b4(Te6edf3bufferTb4b4b4, Tff7b72selfTff7b72.Td2a8ffHW_MTUTb4b4b4)

Tff7b72for Te6edf3packet Tff7b72in Te6edf3packetsTb4b4b4:
Tff7b72if Te6edf3packetTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffputTb4b4b4(Te6edf3packetTb4b4b4)

Tff7b72def Td2a8ff_record_http_requestTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_stats_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_http_requests Tff7b72+Tff7b72= T79c0ff1

Tff7b72def Td2a8ff_handle_tunnel_exchangeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3methodTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3headersTb4b4b4, Te6edf3bodyTb4b4b4)Tb4b4b4:
T8b949e"""Shared request handler for HTTP/1.1 and ASGI paths.

Returns (status, content_type, response_body).
"""
Tff7b72selfTff7b72.Td2a8ff_record_http_requestTb4b4b4(Tb4b4b4)
Te6edf3headers_l Tff7b72= Tb4b4b4{Tffa657strTb4b4b4(Te6edf3kTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657strTb4b4b4(Te6edf3vTb4b4b4) Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3headersTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4}

Tff7b72if Te6edf3method Tff7b72== Ta5d6ff"Ta5d6ffGETTa5d6ff" Tff7b72and Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserve_html_page Tff7b72and Tff7b72selfTff7b72.Td2a8ffhtml_contentTb4b4b4:
Tff7b72return Tb4b4b4(
T79c0ff200Tb4b4b4,
Ta5d6ff"Ta5d6fftext/html; charset=utf-8Ta5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffhtml_contentTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return T79c0ff404Tb4b4b4, Ta5d6ff"Ta5d6fftext/plainTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72if Te6edf3method Tff7b72== Ta5d6ff"Ta5d6ffPOSTTa5d6ff" Tff7b72and Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcheck_user_agentTb4b4b4:
Te6edf3user_agent Tff7b72= Te6edf3headers_lTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffuser-agentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3user_agent Tff7b72!= Tff7b72selfTff7b72.Td2a8ffuser_agentTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffRejected request with invalid User-Agent: Tffd700{Te6edf3user_agentTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)
Tff7b72return T79c0ff403Tb4b4b4, Ta5d6ff"Ta5d6fftext/plainTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffForbiddenTa5d6ff"

Tff7b72if Te6edf3bodyTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3bodyTb4b4b4)Tffd700}Ta5d6ff bytes from clientTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ingest_wire_bytesTb4b4b4(Te6edf3bodyTb4b4b4)

Te6edf3server_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_drain_send_framesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3server_dataTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffSending Tffd700{Tffa657lenTb4b4b4(Te6edf3server_dataTb4b4b4)Tffd700}Ta5d6ff framed bytes to clientTa5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4,
Tb4b4b4)
Tff7b72return T79c0ff200Tb4b4b4, Ta5d6ff"Ta5d6ffapplication/octet-streamTa5d6ff"Tb4b4b4, Te6edf3server_data

Tff7b72return T79c0ff404Tb4b4b4, Ta5d6ff"Ta5d6fftext/plainTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72def Td2a8ffconnection_statsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_stats_lockTb4b4b4:
Te6edf3stats Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fftcp_acceptsTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_tcp_acceptsTb4b4b4,
Ta5d6ff"Ta5d6ffhttp_requestsTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_requestsTb4b4b4,
Ta5d6ff"Ta5d6ffclient_requestsTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_client_requestsTb4b4b4,
Ta5d6ff"Ta5d6fflast_http_versionTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_last_http_versionTb4b4b4,
Ta5d6ff"Ta5d6ffconfigured_http_versionTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhttp_versionTb4b4b4,
Tb4b4b4}
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_h3_session Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpool_num_connectionsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0 Tff7b72if Tff7b72selfTff7b72.Td2a8ff_h3_sessionTff7b72.Td2a8ff_closed Tff7b72else T79c0ff1
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpool_num_requestsTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_h3_sessionTff7b72.Td2a8ff_request_count
Tff7b72return Te6edf3stats

Tff7b72def Td2a8ff_build_asgi_appTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3interface Tff7b72= Tff7b72self

Tff7b72async Tff7b72def Td2a8ffappTb4b4b4(Te6edf3scopeTb4b4b4, Te6edf3receiveTb4b4b4, Te6edf3sendTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3scopeTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ffhttpTa5d6ff"Tb4b4b4:
Tff7b72return

Te6edf3headers Tff7b72= Tb4b4b4{
Te6edf3keyTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6fflatin1Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3valueTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6fflatin1Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3keyTb4b4b4, Te6edf3value Tff7b72in Te6edf3scopeTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffheadersTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tb4b4b4}
Te6edf3body Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3message Tff7b72= Tff7b72await Te6edf3receiveTb4b4b4(Tb4b4b4)
Te6edf3body Tff7b72+Tff7b72= Te6edf3messageTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbodyTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3messageTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmore_bodyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72break

Te6edf3statusTb4b4b4, Te6edf3content_typeTb4b4b4, Te6edf3response_body Tff7b72= Te6edf3interfaceTff7b72.Td2a8ff_handle_tunnel_exchangeTb4b4b4(
Te6edf3scopeTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3scopeTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3headersTb4b4b4,
Te6edf3bodyTb4b4b4,
Tb4b4b4)
Tff7b72await Te6edf3sendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhttp.response.startTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Te6edf3statusTb4b4b4,
Ta5d6ff"Ta5d6ffheadersTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffcontent-typeTa5d6ff"Tb4b4b4, Te6edf3content_typeTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffcontent-lengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3response_bodyTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tb4b4b4)
Tff7b72await Te6edf3sendTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhttp.response.bodyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbodyTa5d6ff"Tb4b4b4: Te6edf3response_bodyTb4b4b4}Tb4b4b4)

Tff7b72return Te6edf3app

Tff7b72def Td2a8ffsetup_server_http1Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3interface_instance Tff7b72= Tff7b72self

Tff7b72class T56d364TunnelRequestHandlerTb4b4b4(Te6edf3BaseHTTPRequestHandlerTb4b4b4)Tb4b4b4:
Te6edf3protocol_version Tff7b72= Ta5d6ff"Ta5d6ffHTTP/1.1Ta5d6ff"

Tff7b72def Td2a8ff_send_common_headersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3content_typeTb4b4b4, Te6edf3content_lengthTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-TypeTa5d6ff"Tb4b4b4, Te6edf3content_typeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3content_lengthTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffConnectionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkeep-aliveTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(
Ta5d6ff"Ta5d6ffKeep-AliveTa5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6fftimeout=Tffd700{Te6edf3interface_instanceTff7b72.Td2a8ffkeepalive_timeoutTffd700}Ta5d6ff, max=1000Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffdo_GETTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3statusTb4b4b4, Te6edf3content_typeTb4b4b4, Te6edf3body Tff7b72= Te6edf3interface_instanceTff7b72.Td2a8ff_handle_tunnel_exchangeTb4b4b4(
Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffpathTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffheadersTb4b4b4,
Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(Te6edf3statusTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_common_headersTb4b4b4(Te6edf3content_typeTb4b4b4, Tffa657lenTb4b4b4(Te6edf3bodyTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3bodyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3bodyTb4b4b4)

Tff7b72def Td2a8ffdo_POSTTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3content_length Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffheadersTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Tff7b72selfTff7b72.Td2a8ffrfileTff7b72.Td2a8ffreadTb4b4b4(Te6edf3content_lengthTb4b4b4) Tff7b72if Te6edf3content_length Tff7b72> T79c0ff0 Tff7b72else Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3statusTb4b4b4, Te6edf3content_typeTb4b4b4, Te6edf3response Tff7b72= Te6edf3interface_instanceTff7b72.Td2a8ff_handle_tunnel_exchangeTb4b4b4(
Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffpathTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffheadersTb4b4b4,
Te6edf3bodyTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(Te6edf3statusTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_common_headersTb4b4b4(Te6edf3content_typeTb4b4b4, Tffa657lenTb4b4b4(Te6edf3responseTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3responseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3responseTb4b4b4)

Tff7b72def Td2a8fflog_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fmtTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72class T56d364ThreadedHTTPServerTb4b4b4(Te6edf3ThreadingMixInTb4b4b4, Te6edf3HTTPServerTb4b4b4)Tb4b4b4:
Te6edf3daemon_threads Tff7b72= Tff7b72True
Te6edf3allow_reuse_address Tff7b72= Tff7b72True

Tff7b72def Td2a8ffget_requestTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3requestTb4b4b4, Te6edf3client_address Tff7b72= Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffget_requestTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3interface_instanceTff7b72.Td2a8ff_stats_lockTb4b4b4:
Te6edf3interface_instanceTff7b72.Td2a8ff_tcp_accepts Tff7b72+Tff7b72= T79c0ff1
Tff7b72tryTb4b4b4:
Te6edf3requestTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_KEEPALIVETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Tff7b72return Te6edf3requestTb4b4b4, Te6edf3client_address

Tff7b72def Td2a8ffrun_serverTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_http_server Tff7b72= Te6edf3ThreadedHTTPServerTb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8fflisten_hostTb4b4b4, Tff7b72selfTff7b72.Td2a8fflisten_portTb4b4b4)Tb4b4b4,
Te6edf3TunnelRequestHandlerTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http_serverTff7b72.Td2a8ffdaemon_threads Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_http_serverTff7b72.Td2a8ffserve_foreverTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTTP server error for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_server_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3run_serverTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_start_receive_loopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffHTTP/1.1 server started on http://Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_portTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffsetup_server_asgiTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787hypercornT7ee787.T7ee787asyncio Tff7b72import Te6edf3serve
Tff7b72from T7ee787hypercornT7ee787.T7ee787config Tff7b72import Te6edf3Config

Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Tb4b4b4)
Te6edf3bind Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_portTffd700}Ta5d6ff"
Te6edf3configTff7b72.Td2a8ffbind Tff7b72= Tb4b4b4[Te6edf3bindTb4b4b4]
Te6edf3configTff7b72.Td2a8ffcertfile Tff7b72= Tff7b72selfTff7b72.Td2a8fftls_certfile
Te6edf3configTff7b72.Td2a8ffkeyfile Tff7b72= Tff7b72selfTff7b72.Td2a8fftls_keyfile
Te6edf3configTff7b72.Td2a8ffalpn_protocols Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffh2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhttp/1.1Ta5d6ff"Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72== T79c0ff3Tb4b4b4:
Te6edf3configTff7b72.Td2a8ffquic_bind Tff7b72= Tb4b4b4[Te6edf3bindTb4b4b4]
Te6edf3configTff7b72.Td2a8ffalpn_protocols Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffh3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffh2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhttp/1.1Ta5d6ff"Tb4b4b4]

Te6edf3app Tff7b72= Tff7b72selfTff7b72.Td2a8ff_build_asgi_appTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_asgi_shutdown Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffrun_serverTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffnew_event_loopTb4b4b4(Tb4b4b4)
Te6edf3asyncioTff7b72.Td2a8ffset_event_loopTb4b4b4(Te6edf3loopTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_asgi_loop Tff7b72= Te6edf3loop
Tff7b72tryTb4b4b4:
Te6edf3loopTff7b72.Td2a8ffrun_until_completeTb4b4b4(
Te6edf3serveTb4b4b4(Te6edf3appTb4b4b4, Te6edf3configTb4b4b4, Te6edf3shutdown_triggerTff7b72=Tff7b72selfTff7b72.Td2a8ff_asgi_shutdownTff7b72.Td2a8ffwaitTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffASGI HTTP server error for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3loopTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_server_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3run_serverTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_start_receive_loopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3proto Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffHTTP/Tffd700{Tff7b72selfTff7b72.Td2a8ffhttp_versionTffd700}Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3protoTffd700}Ta5d6ff server started on https://Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_portTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ff_start_receive_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffreceive_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffsetup_clientTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_max_backoff Tff7b72= T79c0ff30.0

Tff7b72if Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72== T79c0ff3Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_h3_session Tff7b72= Te6edf3_H3SessionTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffserver_urlTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffuser_agentTb4b4b4,
Te6edf3verifyTff7b72=Tff7b72selfTff7b72.Td2a8fftls_verifyTb4b4b4,
Te6edf3ca_certsTff7b72=Tff7b72selfTff7b72.Td2a8fftls_ca_certsTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_http_version Tff7b72= Ta5d6ff"Ta5d6ffHTTP/3Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3verify Tff7b72= Tff7b72selfTff7b72.Td2a8fftls_ca_certs Tff7b72if Tff7b72selfTff7b72.Td2a8fftls_ca_certs Tff7b72else Tff7b72selfTff7b72.Td2a8fftls_verify
Te6edf3limits Tff7b72= Te6edf3httpxTff7b72.Td2a8ffLimitsTb4b4b4(
Te6edf3max_connectionsTff7b72=Tffa657maxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpool_maxsizeTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3max_keepalive_connectionsTff7b72=Tffa657maxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpool_maxsizeTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3keepalive_expiryTff7b72=Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffkeepalive_timeoutTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsession Tff7b72= Te6edf3httpxTff7b72.Td2a8ffClientTb4b4b4(
Te6edf3http2Tff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72== T79c0ff2Tb4b4b4)Tb4b4b4,
Te6edf3verifyTff7b72=Te6edf3verifyTb4b4b4,
Te6edf3headersTff7b72=Tb4b4b4{
Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffuser_agentTb4b4b4,
Ta5d6ff"Ta5d6ffAccept-EncodingTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3limitsTff7b72=Te6edf3limitsTb4b4b4,
Te6edf3timeoutTff7b72=Te6edf3httpxTff7b72.Td2a8ffTimeoutTb4b4b4(T79c0ff5.0Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffclient_loopTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffHTTP/Tffd700{Tff7b72selfTff7b72.Td2a8ffhttp_versionTffd700}Ta5d6ff client started, connecting to Tffd700{Tff7b72selfTff7b72.Td2a8ffserver_urlTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffreceive_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3received_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffgetTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3received_dataTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3received_dataTb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72continue
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError in receive loop for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ff_client_exchangeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3data_to_sendTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72== T79c0ff3Tb4b4b4:
Te6edf3body Tff7b72= Tff7b72selfTff7b72.Td2a8ff_h3_sessionTff7b72.Td2a8ffpostTb4b4b4(Te6edf3data_to_sendTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5.0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_client_requests Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_last_http_version Tff7b72= Ta5d6ff"Ta5d6ffHTTP/3Ta5d6ff"
Tff7b72return Te6edf3body

Te6edf3response Tff7b72= Tff7b72selfTff7b72.Td2a8ffsessionTff7b72.Td2a8ffpostTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserver_urlTb4b4b4, Te6edf3contentTff7b72=Te6edf3data_to_sendTb4b4b4)
Te6edf3responseTff7b72.Td2a8ffraise_for_statusTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_client_requests Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_last_http_version Tff7b72= Te6edf3responseTff7b72.Td2a8ffhttp_version
Tff7b72return Te6edf3responseTff7b72.Td2a8ffcontent

Tff7b72def Td2a8ffclient_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3data_to_send Tff7b72= Tff7b72selfTff7b72.Td2a8ff_drain_send_framesTb4b4b4(Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffSending Tffd700{Tffa657lenTb4b4b4(Te6edf3data_to_sendTb4b4b4)Tffd700}Ta5d6ff framed bytes to serverTa5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4,
Tb4b4b4)
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ff_client_exchangeTb4b4b4(Te6edf3data_to_sendTb4b4b4)

Tff7b72if Te6edf3contentTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3contentTb4b4b4)Tffd700}Ta5d6ff bytes from serverTa5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ingest_wire_bytesTb4b4b4(Te6edf3contentTb4b4b4)

Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffemptyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffget_nowaitTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72break
Tff7b72if Te6edf3packetTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3packetTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReconnected to server for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72= T79c0ff0

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72break
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72% T79c0ff10 Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError communicating with server for Tffd700{Tff7b72selfTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(attempt Tffd700{Tff7b72selfTff7b72.Td2a8ff_consecutive_failuresTffd700}Ta5d6ff): Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72break

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3delay Tff7b72= Tffa657minTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffpoll_interval Tff7b72* Tb4b4b4(T79c0ff2 Tff7b72*Tff7b72* Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72- T79c0ff1Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_max_backoffTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3delay Tff7b72= Tff7b72selfTff7b72.Td2a8ffpoll_interval

Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3delayTb4b4b4)

Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmtuTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffPayload too large (Tffd700{Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tffd700}Ta5d6ff > Tffd700{Tff7b72selfTff7b72.Td2a8ffmtuTffd700}Ta5d6ff) for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4,
Tb4b4b4)
Tff7b72return

Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffputTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDetaching Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsession Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsessionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError closing HTTP session for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_h3_session Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_h3_sessionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError closing HTTP/3 session for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4,
Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhttp_version Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3httpd Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_http_serverTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3httpd Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72def Td2a8ff_shutdownTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3httpdTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3httpdTff7b72.Td2a8ffserver_closeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3_shutdownTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_server_threadTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_server_threadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff2Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffis_aliveTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3httpd Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3httpdTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_asgi_loop Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ff_asgi_shutdown Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_asgi_loopTff7b72.Td2a8ffcall_soon_threadsafeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_asgi_shutdownTff7b72.Td2a8ffsetTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_server_threadTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_server_threadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)

Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4)
Te6edf3ver Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffhttp_versionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Te6edf3lh Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6fflisten_hostTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4)
Te6edf3lp Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffHTTPTunnelInterface[Tffd700{Te6edf3nameTffd700}Ta5d6ff/HTTPTffd700{Te6edf3verTffd700}Ta5d6ff/server/Tffd700{Te6edf3lhTffd700}Ta5d6ff:Tffd700{Te6edf3lpTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72and Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffserver_urlTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffHTTPTunnelInterface[Tffd700{Te6edf3nameTffd700}Ta5d6ff/HTTPTffd700{Te6edf3verTffd700}Ta5d6ff/client/Tffd700{Tff7b72selfTff7b72.Td2a8ffserver_urlTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffHTTPTunnelInterface[Tffd700{Te6edf3nameTffd700}Ta5d6ff/HTTPTffd700{Te6edf3verTffd700}Ta5d6ff/Tffd700{Tff7b72selfTff7b72.Td2a8ffmodeTffd700}Ta5d6ff]Ta5d6ff"


Te6edf3interface_class Tff7b72= Te6edf3HTTPTunnelInterface


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────